package org.smart4j.framework.util;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.NoSuchElementException;
import java.util.Properties;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * description: 读取配置文件的工具类
 * @version v1.0
 * @author w
 * @date 2018年8月26日下午9:03:44
 *
 */

public final class PropsUtil {
	
	private static final Logger logger = LoggerFactory.getLogger(PropsUtil.class);
	
	private static final PropsUtil INSTANSE = new PropsUtil();
	
	/**
	 * description: 获取当前对象实例  --- 单例 饿汉式 
	 * @return
	 * PropsUtil
	 * @version v1.0
	 * @author w
	 * @date 2018年8月26日 下午9:32:49
	 *
	 */
	public static PropsUtil getInstanse(){
		return INSTANSE;
	}
	
	/**
	 * description: 加载配置文件 
	 * @param fileName
	 * @return
	 * Properties
	 * @version v1.0
	 * @author w
	 * @date 2018年8月26日 下午9:17:30
	 */
	public static Properties load(String fileName){
		Properties prop = null;
		InputStream input = null;
		try {
			input = Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName);
			if(null == input){
				logger.error("file not found :"+fileName);
				throw new FileNotFoundException("file not found :"+fileName);
			}
			prop = new Properties();
			prop.load(input);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			if(null != input){
				try {
					input.close();
				} catch (IOException e) {
					logger.error("close input  stream  failure :",e);
				}
			}
		}
		return prop;
	}

	
	/**
	 * description: 获取配置文件属性值 
	 * @param key
	 * @return
	 * String 
	 * @version v1.0
	 * @author w
	 * @date 2018年8月22日 下午4:33:33
	 *
	 */
	private String getValue(String key,Properties prop){
		if(StringUtils.isBlank(key)){
			return null ;
		}
		if(prop.containsKey(key)){
			return prop.getProperty(key);
		}
		return "";
	}
	
	/**
	 * description: 获取配置文件的属性值
	 * @param key
	 * @return
	 * String 
	 * @version v1.0
	 * @author w
	 * @date 2018年8月22日 下午4:39:44
	 */
	public String getProperty(String key,Properties prop){
		String value = getValue(key,prop);
		if(null == value){
			throw new NoSuchElementException(key);
		}
		return value;
	}
	
	/**
	 * description:获取配置文件的属性值,若不存在，返回默认值 defaultValue
	 * @param key
	 * @param defaultValue
	 * @return
	 * String 
	 * @version v1.0
	 * @author w
	 * @date 2018年8月22日 下午4:44:11
	 */
	public String getProperty(String key,String defaultValue,Properties prop){
		String value = getValue(key,prop);
		return value !=null?value:defaultValue;
	}
	
	public Integer getInteger(String key,Properties prop){
		String value = getValue(key,prop);
		if(null == value){
			throw new NoSuchElementException(key);
		}
		return Integer.valueOf(value);
	}
	
	public Integer getInteger(String key,Integer defaultvalue,Properties prop){
		String value = getValue(key,prop);
		return value != null ? Integer.valueOf(value) : defaultvalue;
	}
	
	public Double getDouble(String key,Properties prop){
		String value = getValue(key,prop);
		if(null == value){
			throw new NoSuchElementException(key);
		}
		return Double.valueOf(value);
	}
	
	public Double getDouble(String key,Double defaultvalue,Properties prop){
		String value = getValue(key,prop);
		return value != null ? Double.valueOf(value) : defaultvalue;
	}
	
	public Boolean getBoolean(String key,Properties prop){
		String value = getValue(key,prop);
		if(null == value){
			throw new NoSuchElementException(key);
		}
		return Boolean.valueOf(value);
	}
	
	public Boolean getBoolean(String key,Boolean defaultvalue,Properties prop){
		String value = getValue(key,prop);
		return value != null ? Boolean.valueOf(value) : defaultvalue;
	}
	
}
